home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 18
/
AMIGAplus Sonderheft 18 (1999)(ICP)(DE)[!].iso
/
Forum
/
MichaelRoth
/
3-3-99
/
code
/
code1.asm
< prev
next >
Wrap
Assembly Source File
|
1998-08-15
|
6KB
|
208 lines
;// Include
Include assem:macro/Dir
Include assem:macro/Exec.m
Include assem:macro/Dos.m
Include Dos/DosExtens.i
include macro/filelength
;\\
;// Libraries öffnen
OpenDos 37
;\\
;//ReadArgs
move.l #inputstr,d1 ; Eingabe String
move.l #arry,d2 ; Arry
move.l #0,d3 ; Keine Externe Structur
Dos ReadArgs ; Argumente Lesen
move.l d0,rdargs ; speichern
bne.s .1 ; prüfen ob alles o.k.
error cleanup,20 ; o.k. >.1 Ansonsten Fehlermeldung beenden
.1 ;
lea arry,a0 ; Arry nach a0
;\\
;//File Öffnen und gröe bestimmen
move.l (a0),d1
move.l #MODE_OLDFILE,d2 ; 1005
Dos Open ; File Öffnen
bne.s .2
error cleanup,20
.2
move.l d0,fh
filelength fh,filelänge ; Filelänge bestimmen
;\\
;// Speicher Reservieren
move.l filelänge,d0
move.l #MEMF_CLEAR,d1
Exec AllocMem
move.l d0,memblock
bne.s .memallockok
error cleanup,20
.memallockok
;\\
;// File einlesen
move.l fh,d1
move.l memblock,d2
move.l filelänge,d3
Dos Read
cmp.l filelänge,d0
beq.s .readok
error cleanup,20
.readok
;\\
;// Code
; A0 -> Buffer zum Codieren
; D0 -> Länge des Buffers
; D2.b -> Anfangszeichen des VQ's
; A1 -> KEy
; D1 -> Länge
;//; SUBREGISTER
; A2 -> Endadresse ds Buffers
; A3 -> Endadresse des Keys
; D7 -> StartAdresse des Keys
; A4 -> VQ Adresse
; D4 -> allg. Subreg.
;\\; A5 -> Adresse der Zeile
move.l memblock,a0
move.l filelänge,d0
move.l #32,d2
lea ver,a1
move.l #ver,d1
move.l #ver2,d4
sub.l d4,d1
lea (a0,d0.l),a2 ; Endadresse des Buffers
lea (a1,d1.l),a3 ; und Endadresse des KEy Berechnen
sub.b #1,d2
lea vq,a4
move.w #255,d7
.loop1
move.w #255,d6
add.b #1,d2 ; Äusere schliefe mit je etwa 20 Zyklen
move.b d2,d4
.loop2
move.b d4,(a4)+
add.b #1,d4 ; Innere schleife mit 256 schritten zu je etwa 30 Zyklen
dbra d6,.loop2
dbra d7,.loop1
move.l a1,d7 ; Adresse des Keys wegen Blockcodierung aufhaben
lea vq,a4
.loop3
moveq #0,d5
moveq #0,d4
move.b (a1)+,d4 ; Zeichen von KEy laden
move.b (a0),d5 ; Klartextzeichen laden
lsl.w #8,d4 ; mit k = 256 Multiplizieren *1
add.l d5,d4 ; Offset addieren
move.b (a4,d4),(a0)+ ; Zeile berechnen und auslesen sowie speichern
cmp.l a1,a3 ; Schlüsselvorrat zu Ende ?
bhi.s .goon ; Nein -> Weiter
move.l d7,a1 ; Schlüssel von vorne verwenden
.goon
cmp.l a0,a2 ; Buffer am ende ?
bhi.s .loop3 ; nein -> nächsten Zeichen
*1 Ich mache mir das verschieben von Bits zu nutze; denn dies ist bei
*1 Multiplikationen mit 2^x möglich.
*1 Die Multiplikation mit MULU würde 70 Takte benötigen; so brauche ich
*1 aber nur 24 Takte...
;\\
;// Zielfile Öffnen
lea arry,a0 ; Arry nach a0
move.l 4(a0),d1
move.l #MODE_NEWFILE,d2
Dos Open
move.l d0,d7
bne .ok
error cleanup,20
.ok
move.l d7,d1
move.l memblock,d2
move.l filelänge,d3
Dos Write
move.l d7,d1
Dos Close
;\\
;// CleanUp
cleanup
move.l rdargs,d1
beq.s .end ; Argumente da ?
Dos FreeArgs ; Wenn Nein beenden
move.l fh,d1
beq.s .1 ; File geöffnet
Dos Close ; Wenn nein weiter
.1
move.l memblock,d0
beq.s .2
move.l d0,a1
move.l filelänge,d0
Exec FreeMem
.2
move.l fh2,d1
beq.s .3 ; File geöffnet
Dos Close ; Wenn nein weiter
.3
move.l memblock2,d0
beq.s .4
move.l d0,a1
move.l filelänge2,d0
Exec FreeMem
.4
.end
closedos
moveq #0,d0
rts
;\\
;// Data
DATA
ver dc.b "$VER: V0 - Written by DAC698 - Michael Roth",0
ver2
inputstr
dc.b "Source/A,Dest/A",0;,Key/A",0 ;KeyFile/S",0
cr
dc.b 10,0
BSS
cnop 0,4
vq
ds.b 256*256
cnop 0,4
arry ds.l 2
rdargs ds.l 1
fh ds.l 1
fh2 ds.l 1
filelänge
ds.l 1
memblock ds.l 1
filelänge2
ds.l 1
memblock2
ds.l 1
insert dc.b 4,0
;\\